﻿using System;
using System.Collections.Generic;
using System.Text;

namespace Zzva.Common
{
    public class TCodeComponent
    {



        private string mvarDse;
        private string mvarDisp;
        private string mvarOrder;
        private int mvarDop;
        private string mvarFullCode;
        private string mvarOhZzak;


        //анализ идет от конца полного обозначения
        private const string mvarSmbBeforeOrder = "_";
        private const string mvarSmbBeforeDisp = "/";
        private const string mvarSmbBeforeDse = "-";
        private const string mvarSmbDop = "Д";
        private const string mvarSmbOrder = "К";
        private const string mvarSmbBeforeOhZzak = "-";
        private const string mvarSmbBeetwenDispAndOrderInOhzzak = " ";


        public string OhZzak { get { return mvarOhZzak; } }
        public int Dop { get { return mvarDop; } }
        public string Order { get { return mvarOrder; } }
        public string Disp { get { return mvarDisp; } }
        public string Dse { get { return mvarDse; } }
        public string  FullCode{get{return mvarFullCode;}}




        private bool CheckDse(string pDse)
        {
            if (pDse == null | pDse == "")
            {
                return false;
            }
            else
            {
                return true;
            }
        }

        private bool CheckDisp(string pDisp)
        {
            if (pDisp != null)
            {
                if (pDisp != "")
                {
                    if (float.Parse(pDisp) <= 0)
                    {
                        return false;
                    }
                    else
                    {
                        return true;
                    }
                }
                else
                {
                    return false;
                }
            }
            else
            {
                return true;
            }
        }

        private bool CheckOrder(string pOrder)
        {

            if (pOrder == null | pOrder == "")
            {
                return false;
            }
            else
            {
                return true;
            }

        }

        private bool CheckDop(int pDop)
        {
            if (pDop <= 0)
            {
                return false;
            }
            else
            {
                return true;
            }
        }

        private bool CheckOhZzak(string pOhZzak)
        {

            if (pOhZzak == null | pOhZzak == "")
            {
                return false;
            }
            else
            {
                return true;
            }

        }




        //Инициализация кода для заказного компонента
        //(pDse != null) and (pDse != "")
        //pOhZzak:
        //(pOhZzak != null) and (pOhZzak != "")
        //(pOrder != null) and (pOrder != "")
        // pDop <= 0
        public TCodeComponent(string pDse, string pOhZzak, int pDop)
        {
            try
            {




            }

            catch (Exception e) { throw e; }
            finally { }
        }



        
        ////private GetDispAndOrder(string pOhZzak,out string pDisp,out string pOrder)
        ////{
        ////}









        //Инициализация кода для заказного компонента
        //(pDse != null) and (pDse != "")
        //pDisp:
        //для нулевого исполнения pDisp = null
        //для ненулевого исполнения Numeric(pDisp) <> 0
        //(pOrder != null) and (pOrder != "")
        // pDop <= 0
        public TCodeComponent(string pDse, string pDisp, string pOrder, int pDop)
        {
            try
            {
                string lFullCodeBaseComp;
                string lOhZzak;

                if (CheckDop(pDop) == false) { throw (new CommonException("Ошибка в кодировании заказного компонента")); }

                lFullCodeBaseComp = GetFullCodeBaseComp(pDse, pDisp);
                lOhZzak = GetOhZzak(pDisp, pOrder); 

 
                mvarDse = pDse;
                mvarDisp = pDisp;
                mvarOrder = pOrder;
                mvarDop = pDop;
                mvarFullCode = lFullCodeBaseComp
                             + mvarSmbBeforeDisp + pOrder + mvarSmbBeforeOrder + mvarSmbDop + pDop.ToString();
                mvarOhZzak = lOhZzak;

            }

            catch (Exception e) { throw e; }
            finally { }
        }




        private string GetOhZzak(string pDisp, string pOrder)
        {
            try
            {
                string lOhZzak;
                string lOrder;



                if (CheckDisp(pDisp) == false) { throw (new CommonException("Ошибка в кодировании заказного компонента")); }
                if (CheckOrder(pOrder) == false) { throw (new CommonException("Ошибка в кодировании заказного компонента")); }


                lOrder = mvarSmbOrder + pOrder; 


                if (pDisp == null){lOhZzak = lOrder; }
                else
                {
                    lOhZzak = mvarSmbBeforeOhZzak + pDisp + mvarSmbBeetwenDispAndOrderInOhzzak + lOrder; 
                }


                return lOhZzak; 


            }

            catch (Exception e) { throw e; }
            finally { }
        }



        //Инициализация кода для базового компонента
        //pDisp:
        //для нулевого исполнения pDisp = null
        //для ненулевого исполнения Numeric(pDisp) <> 0
        public TCodeComponent(string pDse, string pDisp)
        {
            try
            {
                string lFullCodeBaseComp;

                lFullCodeBaseComp = GetFullCodeBaseComp(pDse, pDisp); 

                mvarDse = pDse;
                mvarDisp = pDisp;
                mvarOrder = null;
                mvarDop = 0;
                mvarFullCode = lFullCodeBaseComp;
                mvarOhZzak = null;
            }

            catch (Exception e) { throw e; }
            finally { }
        }



        //Вернуть полный код для базового компонента
        private string GetFullCodeBaseComp(string pDse, string pDisp)
        {
            try
            {
                string lDispForFullCode;
                string lFullCodeBaseComp;

                if (CheckDse(pDse) == false) { throw (new CommonException("Ошибка в кодировании заказного компонента")); }
                if (CheckDisp(pDisp) == false) { throw (new CommonException("Ошибка в кодировании заказного компонента")); }

                if (pDisp != null) { lDispForFullCode = mvarSmbBeforeDse + pDisp; }
                else { lDispForFullCode = ""; }

                lFullCodeBaseComp = pDse + lDispForFullCode;

                return lFullCodeBaseComp; 

            }

            catch (Exception e) { throw e; }
            finally { }
        }






 
















 









        //На входе полный код
        public TCodeComponent(string pFullCode)
        {
        }




    }
}
